/**
* @project admin-go-api
* @name sysMenu
* @descriptions 菜单服务层
* @author 寒锋
* @date 2023-12-19 16:01:11
 */

package service

import (
	"admin-go-api/api/dao"
	"admin-go-api/api/entity"
	"admin-go-api/common/response"
	"admin-go-api/common/util"
	"admin-go-api/constants"
	"admin-go-api/pkg/jwt"
	"errors"
	"github.com/gin-gonic/gin"
)

type ISysMenuService interface {
	GetSysMenuList(c *gin.Context, menuName string, menuStatus int)          // 菜单列表
	QuerySysMenuVoList(c *gin.Context)                                       // 菜单下拉列表
	CreateSysMenu(c *gin.Context, sysMenu entity.SysMenu)                    // 添加菜单
	GetSysMenuById(c *gin.Context, id int)                                   // 详情、
	UpdateSysMenu(c *gin.Context, sysMenu entity.SysMenu)                    // 更新菜单
	DeleteSysMenu(c *gin.Context, dto entity.SysMenuIdDto)                   // 删除菜单
	CheckedNodeByAdmin(c *gin.Context, path string) (result bool, err error) // 验证管理员是否有操作权限
}

type SysMenuServiceImpl struct {
}

// GetSysMenuList 菜单列表
func (s SysMenuServiceImpl) GetSysMenuList(c *gin.Context, menuName string, menuStatus int) {
	list := dao.GetSysMenuList(menuName, menuStatus)
	response.Success(c, list)
}

// QuerySysMenuVoList 下拉列表
func (s SysMenuServiceImpl) QuerySysMenuVoList(c *gin.Context) {
	list := dao.QuerySysMenuVoList()
	response.Success(c, list)
}

// CreateSysMenu 添加菜单
func (s SysMenuServiceImpl) CreateSysMenu(c *gin.Context, sysMenu entity.SysMenu) {
	// 验证菜单是否已存在
	sysMenuName := dao.GetSysMenuByName(sysMenu.MenuName, 0)
	if sysMenuName.MenuId > 0 {
		response.Failed(c, int(constants.ApiCode.MenuIsExists), constants.ApiCode.GetMessage(constants.ApiCode.MenuIsExists))
		return
	}
	result := dao.CreateSysMenu(sysMenu)
	if result {
		response.Success(c, nil)
		return
	}
	response.Failed(c, int(constants.ApiCode.FAILED), "添加失败")
}

// GetSysMenuById 详情
func (s SysMenuServiceImpl) GetSysMenuById(c *gin.Context, id int) {
	row := dao.GetSysMenuById(id)
	response.Success(c, row)
}

// UpdateSysMenu 更新菜单
func (s SysMenuServiceImpl) UpdateSysMenu(c *gin.Context, sysMenu entity.SysMenu) {
	// 验证菜单是否存在
	sysMenuRow := dao.GetSysMenuById(int(sysMenu.MenuId))
	if sysMenuRow.MenuId <= 0 {
		response.Failed(c, int(constants.ApiCode.FAILED), "未知菜单")
		return
	}
	// 验证菜单是否已存在
	sysMenuName := dao.GetSysMenuByName(sysMenu.MenuName, int(sysMenu.MenuId))
	if sysMenuName.MenuId > 0 {
		response.Failed(c, int(constants.ApiCode.MenuIsExists), constants.ApiCode.GetMessage(constants.ApiCode.MenuIsExists))
		return
	}
	result := dao.UpdateSysMenu(sysMenu)
	if result {
		response.Success(c, nil)
		return
	}
	response.Failed(c, int(constants.ApiCode.FAILED), "更新失败")
}

// DeleteSysMenu 删除菜单
func (s SysMenuServiceImpl) DeleteSysMenu(c *gin.Context, dto entity.SysMenuIdDto) {
	// 验证菜单是否已分配角色
	role := dao.GetSysRoleMenu(int(dto.MenuId))
	if role.MenuId > 0 {
		response.Failed(c, int(constants.ApiCode.DelSysMenuFailed), constants.ApiCode.GetMessage(constants.ApiCode.DelSysMenuFailed))
		return
	}
	err := dao.DeleteSysMenu(dto)
	if err != nil {
		response.Failed(c, int(constants.ApiCode.FAILED), "删除失败")
		return
	}
	response.Success(c, nil)
}

// CheckedNodeByAdmin 验证按钮权限
func (s SysMenuServiceImpl) CheckedNodeByAdmin(c *gin.Context, path string) (result bool, err error) {
	admin, err := jwt.GetAdmin(c)
	if err != nil {
		return false, err
	}
	adminId := admin.AdminId
	// 获取当前管理员权限列表
	permissions := dao.QueryPermissionList(adminId)
	var permissionArr []string
	for _, item := range permissions {
		permissionArr = append(permissionArr, item.Value)
	}
	if !util.InArray(path, permissionArr) {
		return false, errors.New("无权限访问")
	}
	return true, nil
}

var sysMenuService = SysMenuServiceImpl{}

func SysMenuService() ISysMenuService {
	return &sysMenuService
}
